 1.自定义函数
   
   当 Hive 提供的内置函数无法满足实际的业务处理需要时，可以考虑使用用户自定义
函数进行扩展。用户自定义函数分为以下三类：
   UDF（User Defined Function）。用户自定义函数，一进一出
   UDAF（User Defined Aggregation Function）。用户自定义聚集函数，多进一
出；类似于：count/max/min
   UDTF（User Defined Table-Generating Functions）。用户自定义表生成函
数，一进多出；类似于：explode
 
 2.UDF开发：
   
   继承org.apache.hadoop.hive.ql.exec.UDF
   需要实现evaluate函数；evaluate函数支持重载
   UDF必须要有返回类型，可以返回null，但是返回类型不能为void
 
 3.UDF开发步骤
   
   创建maven java 工程，添加依赖
   开发java类继承UDF，实现evaluate 方法
   将项目打包上传服务器
   添加开发的jar包
   设置函数与自定义函数关联
   使用自定义函数
   
   需求：扩展系统 nvl 函数功能：
   -- 系统内建的 nvl 函数
   nvl(ename, "OK"): ename==null => 返回第二个参数
   -- 要实现的函数功能
   nvl(ename, "OK"): ename==null or ename=="" or ename=="   " => 返回第二个参数
   1).创建maven java 工程，添加依赖
   <!-- pom.xml 文件 -->
   <dependencies>
      <dependency>
         <groupId>org.apache.hive</groupId>
         <artifactId>hive-exec</artifactId>
         <version>2.3.7</version>
      </dependency>
   </dependencies>
   2).开发java类继承UDF，实现evaluate 方法
   3).将项目打包上传服务器
   4).添加开发的jar包（在Hive命令行中）
   add jar /home/hadoop/hiveudf.jar; 
   5).创建临时函数。指定类名一定要完整的路径，即包名加类名
   create temporary function mynvl as "cn.lagou.hive.udf.nvl"; 
   6).执行查询
   -- 基本功能还有
   select mynvl(comm, 0) from mydb.emp;
   -- 测试扩充的功能
   select mynvl("", "OK");
   select mynvl(" ", "OK");
   7).退出Hive命令行，再进入Hive命令行。执行步骤6的测试，发现函数失效。
   备注：创建临时函数每次进入Hive命令行时，都必须执行以下语句，很不方便：
   add jar /home/hadoop/hiveudf.jar;
   create temporary function mynvl as "cn.lagou.hive.udf.nvl";
 
 4.可创建永久函数：
   
   1).将jar上传HDFS
      hdfs dfs -mkdir jar/
      hdfs dfs -put hiveudf.jar jar/ 
   2).在Hive命令行中创建永久函数
      create function mynvl1 as 'cn.lagou.hive.udf.nvl' using jar
	  'hdfs://linux121/user/root/jar/hiveudf.jar';
	  -- 查询所有的函数，发现 mynvl1 在列表中
      show functions;
   3).退出Hive，再进入，执行测试
      -- 基本功能还有
     select mynvl(comm, 0) from mydb.emp;
     -- 测试扩充的功能
     select mynvl("", "OK");
     select mynvl(" ", "OK");
   4).删除永久函数，并检查
     drop function mynvl1;
     show functions;